
package TokensDelLenguaje;

import java.util.ArrayList;
import java.util.Iterator;

public class Token_Struct extends Token_Identificador implements Cloneable{
    
    private int tamano = 0;
    private Token_Identificador tipoPadre = new Token_Identificador(Tokens.ilegal);
    private ArrayList<Token_Identificador> elementosEstructura = new ArrayList();
            
    public Token_Struct(String identificador){
        super(identificador);
        setId(Tokens.struct);
    }
    
    public ArrayList<Token_Identificador> getElementos(){
        return elementosEstructura;
    }
    
    public void agregarElemento(Token_Identificador tk){
        //tk.setOffset(tamano);
        this.elementosEstructura.add(tk);
        tamano = tamano + tk.getTamano();
    }
    
    public void agregarElementos(ArrayList<Token> tks){
        for (Iterator it = tks.iterator(); it.hasNext();){
            Token_Identificador tk = (Token_Identificador)it.next();
            //tk.setOffset(tamano);
            this.elementosEstructura.add(tk);
            this.tamano = tamano + tk.getTamano();
        }
    }
    
    public int getOffset(Token t){
       
       boolean listo = false;
       int offset = 0;
       int i = 0;
       while (i < this.elementosEstructura.size() && !listo){
           
           if(elementosEstructura.get(i).getCadena().equalsIgnoreCase(t.getCadena())){
               listo = true;
                       }
           else{   
                offset = offset + this.elementosEstructura.get(i).getTamano();
                i++;
           }
       }
       return offset;      
     /*  int offset = 0;
       for(int i=0; i < this.elementosEstructura.size(); i++){
           if(elementosEstructura.get(i).getCadena().equalsIgnoreCase(t.getCadena()))
               return elementosEstructura.get(i).getOffset();
       }
       return 0;
    
     */
   }
    
    @Override
    public Object clone(){
        Token_Struct copia=null;
        
        copia=(Token_Struct)super.clone();
    
        copia.setCopiaTamano(this.tamano);
        copia.setCopiaTipoPadre((Token_Identificador)this.tipoPadre.clone());
        copia.setCopiaElementosEstructura(this.elementosEstructura);
        
        return copia;
    }
     
    public void setTamano(int t){
        this.tamano = t;
        
    }
    
    private void setCopiaTamano(int t){
        this.tamano = t;
        
    }

    private void setCopiaTipoPadre(Token_Identificador tipoPadre) {
        
       this.tipoPadre = tipoPadre;

    }

    private void setCopiaElementosEstructura(ArrayList<Token_Identificador> elementosEstructura) {
        
        ArrayList <Token_Identificador> copiaElementos = new ArrayList();
        Token_Identificador id1;
        for(Iterator it = elementosEstructura.iterator();it.hasNext();){
            
            id1 = (Token_Identificador)((Token_Identificador)it.next()).clone();
            copiaElementos.add(id1);
            
        }
        
        this.elementosEstructura = copiaElementos;
    }
     
    @Override
      public void setPadre(Token_Identificador token_Identificador) {
        this.tipoPadre = token_Identificador;
    }

    @Override
    public String toString() {
        //return ("[ { "+ super.toString() + " Elementos de la Estruc: " + this.elementosEstructura.toString() + " } ]");
        String s = "[ " + super.toString() + " Elem. de la Estruc: {";
        for(int i=0; i<elementosEstructura.size(); i++){
            s += "(" + elementosEstructura.get(i).toString() + "-"+ this.getOffset(elementosEstructura.get(i)) + ")";
        }
        s += "} ]";
        return s;
    }
    
    @Override
    public int getTamano() {
        int tam = 0;
        for(int i=0; i<this.elementosEstructura.size(); i++)
            tam = tam + elementosEstructura.get(i).getTamano();
        return tam;
    }
    
    public int getTamano(Token t){
        for(int i=0; i<this.elementosEstructura.size(); i++)
            if(elementosEstructura.get(i).getNombre().equals(t.getNombre())){
                return elementosEstructura.get(i).getTamano();
            }
        return 0;
    }

    public Token getElementos(String nombre) {
        for(int i=0;i<this.elementosEstructura.size();i++){
            if(elementosEstructura.get(i).getCadena().equals(nombre))
                return elementosEstructura.get(i);
        }
        return null;
    }

}
